自動化流程的價值在於讓相同輸入經過相同檢查,產生可以追溯的建置成品(Artifact)與結果。把既有人工指令直接搬進自動化工具,只能減少輸入次數。如果流程沒有明確門檻、成品身分、停止條件與復原方式,錯誤也會更快進入下一個環境。
部署工具與環境限制應該已經先行確認,本章聚焦於如何把程式碼檢查、測試、建置、核准、部署及部署後驗證串成可重複流程。
持續整合(Continuous Integration, CI)、持續發布(Continuous Delivery)與持續部署(Continuous Deployment)代表不同的自動化範圍。
| 作法 | 自動化範圍 | 完成條件 |
|---|---|---|
| 持續整合 | 對候選變更執行檢查、測試與建置 | 變更可安全合併,且失敗原因可以定位 |
| 持續發布 | 產生經過驗證且隨時可以部署的成品 | 成品、核准資料與部署方式都已準備完成 |
| 持續部署 | 通過所有條件後自動部署至指定環境 | 部署後檢查通過,且結果已被記錄 |
採用持續發布不代表每次變更都會自動進入正式環境。採用持續部署也不代表取消核准與保護規則,核准可以成為自動化流程中的必要關卡。選擇範圍時要考慮變更風險、部署頻率、操作責任及正式環境限制。
每種觸發方式都要對應明確目的,避免相同流程因入口不同而執行不一致的檢查。
| 觸發方式 | 主要目的 | 可以產生的結果 |
|---|---|---|
| 候選變更建立或更新 | 及早發現格式、靜態分析、測試與建置問題 | 檢查結果,不建立正式發布 |
| 變更合併至共同版本 | 確認共同版本仍可建置及整合 | 候選成品與完整測試結果 |
| 發布標籤建立 | 固定準備發布的來源版本 | 正式成品、發布資訊與待核准部署 |
| 人工核准 | 確認環境、時段與風險條件 | 允許既有成品進入指定環境 |
| 排程或人工重跑 | 執行完整、耗時或定期檢查 | 專項報告或既有成品的重新驗證 |
流程必須驗證觸發來源。例如,正式部署只能接受受保護分支或發布標籤時,就要在進入部署工作前拒絕其他來源。人工重跑也要保存原始提交、成品與觸發原因,不能因重新執行而失去追溯關係。
檢查順序應該先執行速度快、失敗後無須繼續的工作,再進入需要較多時間或外部相依項目的工作。常見順序如下:
各階段可以在相依關係允許時平行執行,但後續工作只能使用已通過前置條件的輸入。單一非必要報告失敗是否阻擋流程,也要事先分類,不能在失敗發生後才臨時決定。
本機與自動化流程應該呼叫相同的專案指令。格式、測試與建置如果只存在於特定平臺的流程檔案,開發人員就難以在提交前重現失敗。共同指令則負責實際工作,自動化工具只安排觸發、執行環境、相依順序與結果保存。
共同指令應該具備下列特性:
流程檔案、共用指令與工具版本都要納入版本控制。修改其中一項時,應該使用候選流程驗證新定義,再讓它成為共同版本。
測試策略已經定義案例層級、執行條件與阻擋範圍。自動化流程要保存這些差異,不能把所有測試都縮成一個只有通過或失敗的步驟。
| 測試範圍 | 建議觸發時機 | 失敗處理 |
|---|---|---|
| 單元與快速靜態檢查 | 每次候選變更 | 阻止合併,回報可定位結果 |
| 整合與契約測試 | 影響相關邊界時,或共同版本更新時 | 阻止產生可發布成品 |
| 端對端關鍵流程 | 共同版本、發布候選或部署前 | 阻止發布或部署 |
| 資料遷移與復原演練 | 遷移程式、保存結構或相容規則變更時 | 阻止包含該異動的部署 |
| 效能、安全與耐久等專項測試 | 按照風險、成本與排程觸發 | 按照已核准門檻阻擋或要求人工確認 |
| 部署後冒煙測試 | 每次部署後 | 停止擴大部署並啟動既定復原程序 |
測試失敗要保留案例識別、目標版本、執行環境、實際結果與相關報告。允許重跑時,還要區分程式缺陷、測試不穩定、環境失敗與相依項目異常。反覆執行直到偶然通過,不能視為穩定結果。
準備發布的來源提交應該只建置一次正式候選成品。測試、預備與正式環境使用相同成品,再由各環境提供必要設定。這可以避免不同環境分別建置,使工具或相依差異產生不同內容。
每份成品至少要記錄來源提交、發布版本、流程執行識別與內容摘要。進入下一個環境前,流程應該重新驗證內容識別。GitHub Actions 的工作流程成品與GitLab CI/CD 的工作成品都能在工作之間保存建置輸出及報告。實際保存位置可以不同,但不能依賴容易被覆寫的檔名辨識內容。
測試報告與部署成品要分開管理。報告說明某項檢查結果,部署成品則是實際執行內容。兩者可以由同一次流程產生,保存期限與存取範圍仍可能不同。
同一份成品移動至不同環境時,不應重新寫入程式內容。環境差異應該透過已定義的設定介面提供,並在啟動前驗證必要欄位、格式與允許值。
如果成品必須因環境不同而重新建置,就要先確認差異是否真的屬於建置內容。確有必要時,每個結果都是不同成品,必須分別產生識別並完成檢查。
一項發布可能包含多個部署單位、保存結構異動、背景工作或靜態內容。流程要按照相依方向與相容條件安排順序,並考慮新舊版本短時間同時存在的情況。
如果系統包含保存結構異動,可以先採用新舊程式都能接受的擴充變更,再部署使用新結構的程式,最後於確認停止使用後移除舊結構。無法維持相容的異動需要明確停機、停止寫入或其他隔離條件,不能讓自動化工具自行猜測順序。
滾動部署(Rolling Deployment)、藍綠部署(Blue-Green Deployment)與金絲雀發布(Canary Release)只是在特定部署架構下控制替換範圍的方式。採用前要確認部署環境支援、版本相容、狀態保存、觀察門檻及停止方式,不能只因工具提供選項就啟用。
正式部署應該只允許經過授權的來源、成品與操作方式。部署工作只取得完成該環境工作所需的存取範圍,建置工作不應該預設具有正式部署能力。
自動化平臺可以把核准、分支限制、環境設定與部署紀錄放入流程。例如,GitHub Actions 的部署環境可以設定核准與部署來源限制。選定平臺後,仍要另外確認方案限制、執行器位置、核准責任及敏感設定的可見範圍。
同一環境還要限制並行部署。後一個版本不能在前一個版本尚未完成驗證時直接覆蓋狀態。流程可以使用佇列、互斥或取消過期候選等方式,並明確記錄哪一次部署取得執行權。
部署指令成功只表示工具完成預定動作。流程還要驗證目標程式能否啟動、是否準備完成,以及關鍵功能是否產生預期結果。
部署後檢查可以分成下列層次:
健康檢查與冒煙測試的責任不同。健康檢查適合快速判斷程式是否可被部署平臺使用,冒煙測試則驗證少量關鍵功能。兩者都不能取代完整測試策略。
每個階段都要定義停止條件與可再次執行的起點。
| 失敗位置 | 預設處理 | 需要保存的內容 |
|---|---|---|
| 檢查或測試 | 停止建置或發布 | 失敗案例、工具版本與報告 |
| 建置 | 不產生可發布成品 | 來源提交、建置步驟與錯誤位置 |
| 部署前核准 | 維持既有環境狀態 | 候選成品、未通過條件與決定 |
| 部署進行中 | 停止擴大範圍,確認目前狀態 | 已完成單位、失敗步驟與可重跑位置 |
| 部署後檢查 | 啟動既定還原、切換回既有結果或向前修正 | 版本、影響範圍、觀察結果與處理決定 |
選擇還原(Rollback)或向前修正(Roll Forward)前,要先確認程式、保存結構與資料變更是否相容。無法安全還原時,流程應該停止新操作、隔離影響或執行已驗證的修正程序。每種處理方式都要事先演練,並且以固定條件判斷完成。
流程定義也是目標系統的一部分,需要測試與維護。可以使用不影響正式結果的方式,定期驗證下列情境:
流程變更也要經過審查。修改觸發條件、略過測試、擴大正式環境存取或改變復原方式,都可能直接改變發布風險,不能只當成設定格式調整。